package pers.cfeng.server.dataManage;

import pers.cfeng.server.dataManage.dataItem.DataItem;
import pers.cfeng.server.dataManage.logger.Logger;
import pers.cfeng.server.dataManage.page.PageFirst;
import pers.cfeng.server.dataManage.pageCache.PageCache;
import pers.cfeng.server.dataManage.recover.DataRecover;
import pers.cfeng.server.txManage.TransactionManager;

/**
 * DM的抽象接口,利用page、pageCache、pageFirst和pageCommon完成数据的操作
 */

public interface DataManager {
    DataItem read(long uid) throws Exception;

    long insert(long tid, byte[] data) throws Exception;

    void close();

    /**
     * @param path  db和log文件的路径
     * @param mem    允许使用的内存空间的大小【缓存多少个页面】
     * @param tm    事务管理器
     * 初始化的时候需要创建db、log文件
     */
    static DataManager create(String path, long mem, TransactionManager tm) {
        PageCache pageCache = PageCache.create(path, mem);
        Logger logger = Logger.create(path);

        DataManagerImpl dm = new DataManagerImpl(pageCache, tm, logger);
        dm.initPageOne(); //初始化第一页
        return dm;
    }

    static DataManager open(String path, long mem, TransactionManager tm) {
        PageCache pageCache = PageCache.open(path, mem);
        Logger logger = Logger.open(path);
        DataManagerImpl dm = new DataManagerImpl(pageCache, tm, logger);
        if(!dm.loadCheckPageOne()) {//校验不成功，说明故障，需要恢复
            DataRecover.recover(tm, logger, pageCache);
        }
        dm.fillPageIndex();
        PageFirst.setRunControlOpen(dm.getPageOne());
        dm.pageCache.flushPage(dm.getPageOne());
        return dm;
    }
}
